home *** CD-ROM | disk | FTP | other *** search
/ Languguage OS 2 / Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO / language / embedded / mcu / float09.arc / FADS.SA < prev    next >
Text File  |  1987-03-04  |  9KB  |  302 lines

  1. *
  2.    NAM    FADS
  3.    TTL FLOATING-POINT ADD ROUTINE
  4. *
  5. * LINKNG LOADER DEFINITIONS
  6. *
  7.   XREF    TFRACT,VALID,FRCTAB,BITTBL,DNORM1,NORMQK
  8.   XREF    FPMOVE,XADDY,CLRES,COMP2,DENORM
  9. *
  10.   XDEF    FADD,FSUB
  11. *
  12. *
  13. *    REVISION HISTORY:
  14. *      DATE         PROGRAMMER           REASON
  15. *
  16. *    23.MAY.80         G.WALKER              ORIGINAL
  17. *    16.JUN.80         G. STEVENS           FIX FSUB
  18. *     1.JUL.80         G.WALKER              CODE COMPACTION
  19. *    13.JUL.80         G.WALKER              SPEED & SHRINK
  20. *    17.JUL.80         G.WALKER              REWRITE TO CORRECT
  21. *                        HANDLING OF UN-NORM.
  22. *    22.JUL.80         G.WALKER              INCLUDE STICKY IN COMPL.
  23. *    06.AUG.80         G.WALKER              OR BITS OF RESULT INTO
  24. *                        STICKY BYTE
  25. *    13.AUG.80         G.WALKER              SAVE BYTES USING "DENORM"
  26. *    18.AUG.80         G. STEVENS           SAVE MORE BYTES W/ "DENORM"
  27. *    07.OCT.80         G.WALKER              CORRECT LARGER ARG MOVE
  28. *
  29.   PAG
  30. **************************************************
  31. *
  32. *    FADD --
  33. *     ADDS TWO ARGUMENTS FROM THE STACK FRAME
  34. *    AND LEAVES THE RESULT IN THE STACK FRAME. THE
  35. *    EXPONENT OF THE RESULT IS THE LARGEST OF THE
  36. *    TWO EXPONENTS.  THE ARGUMENT WITH THE SMALLER
  37. *    EXPONENT IS DENORMALIZED UNTIL THE TWO EXPONENTS
  38. *    ARE EQUAL.  BITS SHIFTED OUT TO THE RIGHT ARE OR'ED
  39. *    INTO THE STICKY BYTE.
  40. *     IF THE DIFFERENCE IN EXPONENTS EXCEEDS ROUNDING
  41. *    PRECISION + GUARD BIT, THEN RESULT IS ARGUMENT
  42. *    WITH THE LARGEST EXPONENT,  ELSE THE ARGUMENT WITH
  43. *    THE SMALLEST FRACTION IS COMPLEMENTED AND THE TWO
  44. *    FRACTIONS ARE ADDED.  THE RESULT IS TESTED FOR ZERO
  45. *    DUE TO CANCELLATION AND NORMALIZED IF ONE OF THE
  46. *    INPUT ARGUMENTS WAS NORMALIZED.
  47. *
  48. *    ALGORITHM IS:
  49. *
  50. *    IF EXP1 > EXP2 THEN
  51. *     EXPR=EXP1; SMALLER=ARG2;
  52. *    ELSE
  53. *     EXPR=EXP2; SMALLER=ARG1;
  54. *    ENDIF
  55. *    GET ABSOLUTE DIFFERENCE IN EXPONENTS;
  56. *    IF DIFFERENCE > PRECISION THEN
  57. *    RETURN LARGER ARGUMENT;
  58. *    ELSE
  59. *      DENORMALIZE SMALLER, THROWING BITS TO THE RIGHT
  60. *     INTO THE STICKY BUCKET;
  61. *      REMEMBER IF ONE ARGUMENT IS NOW NORMALIZED;
  62. *      IF SIGN1 <> SIGN2 THEN
  63. *     IF FRACT1 < FRACT2 THEN
  64. *       2'S COMPL. FRACT1;  SIGNR=SIGN2
  65. *     ELSE
  66. *       2'S COMPL. FRACT2; SIGNR=SIGN1
  67. *     ENDIF
  68. *      ENDIF   SIGNS ARE NOT EQUAL
  69. *      ADD THE FRACTIONS INTO THE RESULT
  70. *    ENDIF
  71. *
  72. *    IF THE V-BIT IS SET THEN
  73. *    SHIFT RESULT FRACTION RIGHT ONE BIT AND INCREMENT
  74. *    RESULT EXPONENT;
  75. *    ENDIF
  76. *    IF FRACTR = 0 THEN
  77. *      IF ONE ARGUMENT WAS NORMALIZED
  78. *     RETURN SIGNED NORMAL ZERO
  79. *      ELSE
  80. *     RETURN SIGNED UN-NORMALIZED ZERO
  81. *      ENDIF
  82. *    ELSE     FRACTR <> 0
  83. *      IF ONE ARGUMENT WAS NORMALIZED
  84. *     NORMALIZE RESULT
  85. *      ENDIF
  86. *    ENDIF
  87. *    CHECK FOR UNDERFLOW;
  88. *    ROUND RESULT TO PROPER PRECISION;
  89. *    CHECK FOR OVERFLOW.
  90. *
  91. ***
  92. *
  93. *    LOCAL STORAGE USED:  (STACK DISPLACEMENT)
  94. *    FRCNDX (1) -- LARGEST INDEX OF BYTES IN FRACT.
  95. *    FRBITS (2) -- TWO BYTE COUNT OF SIGNIFICANT BITS +
  96. *             GUARD BIT IN THE FRACTION
  97. *    EXPDIF (2) -- (2 BYTES) DIFFERENCE IN EXPONENTS
  98. *    ADUNRM (1) -- MSBIT IS 0 IF BOTH ARGUMENTS WERE
  99. *              UNNORMALIZED AFTER DENORMALIZATION
  100. *              OF SMALLER ARGUMENT
  101. *    TMPX   (2) -- TEMP. SAVE FOR X-REGISTER
  102. *    DIDCMP (1) -- =0 IF NO COMPLEMENT, =1 IF A COMPLEMENT
  103. *              WAS PERFORMED.
  104. *
  105. *
  106. FRCNDX SET 0
  107. FRBITS SET 1
  108. EXPDIF SET 3
  109. ADUNRM SET 5
  110. TMPX   SET 6
  111. DIDCMP SET 8
  112. *
  113. *
  114. FADD EQU *
  115.    LEAS -9,S   RESERVE LOCAL STORAGE
  116.    LDA RPREC,U
  117.    LSRA
  118.    LEAX FRCTAB,PCR
  119.    LDB A,X    GET # BYTES FOR THIS PRECISION
  120.    DECB       CHANGE TO LARGEST INDEX
  121.    STB    FRCNDX,S
  122.    LEAX BITTBL,PCR
  123.    LDB A,X
  124.    SEX               EXTEND TO 16 BIT
  125.    STD FRBITS,S     SAVE # OF FRACTION BITS
  126.    CLR    DIDCMP,S       DEFAULT TO NO COMPL.
  127. *
  128. *    FIND WHICH ARGUMENT IS SMALLER
  129. *
  130.    LDX    EXP1,U
  131.    IF  X,GT,(EXP2,U)
  132.      LEAX  ARG1,U       X POINTS TO ARG WITH LARGER EXP
  133.      LEAY  ARG2,U       Y POINTS TO ARG WITH SMALLR EXP
  134.    ELSE
  135.      LEAX  ARG2,U       X POINTS TO ARG WITH LARGER    EXP
  136.      LEAY  ARG1,U       Y POINTS TO ARG WITH SMALLER EXP
  137.    ENDIF
  138. *
  139. *     CREATE ABSOLUTE DIFFERENCE IN EXPONENTS.
  140. *
  141.    LDD EXP,X       SUBTRACT SMALLER EXP FROM LARGER
  142.    SUBD EXP,Y
  143.    STD EXPDIF,S  SAVE DIFFERENCE IN EXPS
  144.    LEAX FRACT,X      POINT TO FRACTION PART
  145.    LEAY FRACT,Y
  146. *
  147. *     IF THE DIFFERENCE IN EXPONENTS IS LARGER THAN THE
  148. *   NUMBER OF SIGNIFICANT BITS IN THIS PRECISION, THEN
  149. *   'OR' THE  FRACTION OF THE SMALLER ARGUMENT INTO
  150. *   THE STIKY BYTE AND MOVE LARGER FRACTION TO THE RESULT.
  151. *
  152.    IF D,GT,(FRBITS,S)  UNLESS FRACTIONS OVERLAP
  153.     LDA 0,X       TEST NORMALIZATION OF LARGER ARG
  154.     ANDA  #$80        (SMALLER IS DENORMED)
  155.     STA ADUNRM,S
  156.     LDA FRCNDX,S
  157.     CLRB        INITIAL STICKY BYTE IS ZERO
  158.     WHILE A,GE,#0
  159.      ORB A,Y       'OR' SMALLER FRACTION
  160.      DECA         INTO STICKY BYTE
  161.     ENDWH
  162.     STB  STIKY,U      SAVE NEW STIKY BYTE
  163.     LEAX -FRACT,X     POINT TO ENTIRE FP NUMBER FOR MOVE
  164. *              LARGER ARG WILL BE COPIED TO RSLT
  165.    ELSE  L     SMALLER FRACTION OVERLAPS
  166. *
  167. *    ELSE DENORMALIZE SMALLER AND SHIFT ONE BITS
  168. *    OUT OF THE RIGHT INTO THE STICKY BYTE.
  169. *
  170.    PSHS  X             SAVE XREG
  171.    LEAX  -FRACT,Y          POINT TO SMALLER NUMBER
  172.    LBSR  DENORM          DENORM IT BASE ON COUNT IN 'B'
  173.    PULS  X             RESTORE X-REG
  174. *
  175. *     TEST NORMALIZATION OF FRACTIONS: 'ADUNRM'
  176. *    IS =1 IF ONE WAS NORMALIZED, =0 IF BOTH UNNORM-
  177. *    ALIZED.
  178. *
  179.    LDA    0,X
  180.    ORA    0,Y   STORE WHETHER EITHER FRACTION
  181.    ANDA  #$80     MASK TO MSBIT
  182.    STA    ADUNRM,S    IS NORMALIZED
  183. *
  184. *     IF ARGS DIFFER IN SIGN, THEN COMPLEMENT
  185. *  THE SMALLER ARG'S FRACTION
  186. *
  187.    LDA ARG1,U
  188.    IF A,NE,(ARG2,U) UNLESS SIGNS THE SAM
  189. *
  190. *     COMPARE SIZES OF FRACTIONS.
  191. *
  192.    LDA    #1
  193.    STA    DIDCMP,S       SAVE THAT COMPLEMENT WAS DONE
  194.    STX    TMPX,S          TEMP. SAVE X-REG FOR COMPL.
  195.    CLRA     BYTE INDEX
  196.    LDB A,X
  197.    WHILE B,EQ,(A,Y)   LOOP TO COMPARE BYTES
  198.      CMPA  FRCNDX,S     IF ALL BYTES ARE COMPARED,
  199.      BGE   FADSMY       THEN FRACTS ARE EQUAL
  200.      INCA
  201.      LDB A,X
  202.    ENDWH
  203. *     IF BYTES NOT EQUAL, THEN BRANCH ON CC-REG.
  204.    BHI FADSMY        Y POINTS TO SMALLER FRACT
  205. *
  206. FADSMX EQU *     FRACT,X IS SMALLER
  207.    LDA    -FRACT,Y      GET SIGN OF LARGER FRACT IN A
  208.    STA    -FRACT,X      RESULT SIGN INTO ARG WITH LARGER EXP
  209. *                (WILL ULTIMATELY BE MOVED TO RESULT)
  210.    BRA    DOCMPL         COMPLEMENT FRACT POINTED TO BY X-REG
  211. *
  212. *     NOW COMPLEMENT THE SMALLER FRACTION.
  213. *
  214. FADSMY EQU *           Y-POINTS TO SMALLER FRACTION
  215.      LEAX  0,Y           POINT X TO SMALLER FRACTION
  216. *
  217. DOCMPL EQU *
  218.      LDB  FRCNDX,S     B CONTAINS LARGEST INDEX INTO FRACTION
  219.      IF  X,EQ,(TMPX,S)          IF FRACTION TO BE COMPLEMENTED
  220.        LBSR  COMP2        WAS NOT DENORMALIZED--2'S COMPL.
  221.      ELSE              ELSE STIKY BYTE IS PART OF FRACTION
  222.        IFTST  (STIKY,U),EQ,#0     IF ZERO STIKY, DO 2'S COMP
  223.      LBSR  COMP2
  224.        ELSE              ELSE DO 1'S COMP.
  225.      WHILE    B,GE,#0
  226.        COM    B,X
  227.        DECB
  228.      ENDWH
  229.        ENDIF           TEST ON STIKY = 0
  230.      ENDIF           COMPLEMENT DENORMALIZED FRACTION
  231.      LDX  TMPX,S       RESTORE POINTER TO ARG WITH SMLR EXP
  232.    ENDIF     SIGNS ARE NOT THE SAME
  233. *
  234. *    ADD TWO FRACTIONS INTO RESULT
  235. *
  236.     LBSR XADDY           ADD FRACTIONS
  237.     LEAX -FRACT,X      POINT TO ENTIRE FP NUMBER
  238.     IFCC  CS         IF WAS CARRY OUT FROM ADD
  239.       IFTST  (DIDCMP,S),EQ,#0      AND WAS NOT COMPLEMENTED
  240.        LBSR  DNORM1      ADJUST FOR OVERFLOW
  241.       ENDIF
  242.     ENDIF
  243. *
  244.    ENDIF    FRACTIONS OVERLAP
  245. *
  246.    LEAY RESULT,U
  247.    LBSR FPMOVE          MOVE FP NUMBER TO RESULT
  248.    LEAX RESULT,U      POINT X TO RESULT
  249.    LBSR TFRACT
  250.    IFCC EQ          IF FRACTION IS ZERO
  251.     IFTST  (ADUNRM,S),LT,#0   IF ONE ARG NORMALIZED
  252.       LDD  #ZEROEX        SET EXPONENT FOR NORMAL ZERO
  253.       STD  EXPR,U
  254.     ENDIF         NORMAL RESULT
  255.     LDY PFPCB,U
  256.     LDA CTL,Y
  257.     ANDA #CTLRND     CHECK ROUNDING MODE
  258.     IF A,EQ,#RM      IF ROUND TO -INFINITY
  259.      LDA #$80
  260.      STA RESULT,U        SET RESULT TO -0
  261.     ELSE
  262.      CLRA         IF ROUND TO +INFINITY
  263.      STA RESULT,U        SET RESULT TO +0
  264.     ENDIF
  265.    ELSE     FRACTION IS NON-ZERO
  266.     IFTST  (ADUNRM,S),LT,#0    IF ONE ARG NORMALIZED
  267.      LBSR NORMQK    NORMALIZE RESULT
  268.     ENDIF     ONE ARGUMENT WAS NORMALIZED
  269. *
  270. *    THE LOW ORDER BYTES OF THE RESULT ARE
  271. *    OR'ED INTO THE STIKY BYTE. THE 'ROUND' ROUTINE
  272. *    WILL 'OR' THE BITS IN THE SAME BYTE AS THE GUARD BIT
  273. *     INTO THE STICKY BYTE.
  274. *
  275.      LDB  #0
  276.      LBSR  DENORM
  277. *
  278.    ENDIF    FRACTION WAS ZERO TEST
  279. *
  280. *     FINISH PROCESSING WITH CHECKS
  281. *   FOR EXCEPTIONAL CONDITIONS
  282. *
  283.    LBSR VALID         CHECK FOR VALID RESULT
  284.    LEAS 9,S    REMOVE LOCAL STORAGE
  285. *
  286.    RTS
  287.   TTL  FLOATING-POINT SUBTRACT
  288.   PAG
  289. ************************************************************
  290. *
  291. *    FSUB --
  292. *    SUBTRACTS ARG2 FROM ARG1, LEAVING DIFFERENCE IN RESULT,
  293. *    BY NEGATING ARG2 AND CALLING 'FADD'.
  294. *
  295. FSUB EQU *
  296.   LDA  ARG2,U
  297.   COMA
  298.   ANDA #$80             NEGATE ARG2
  299.   STA  ARG2,U             RESTORE SIGN
  300.   LBSR FADD               AND ADD
  301.   RTS
  302.